{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d1f20875-c50d-46df-906b-49ec1d0c6002",
   "metadata": {},
   "source": [
    "# 5.6 用梯度下降法求解多元线性回归"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "c90a18b9-d8e8-431c-856c-35f1e4ed05e1",
   "metadata": {},
   "source": [
    "### 1.任务描述\n",
    "\n",
    "一组房屋面积的数据如下（16个）：\n",
    "\n",
    "137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21。\n",
    "\n",
    "与房屋对应的房间数为（16个）：\n",
    "\n",
    "3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2。\n",
    "\n",
    "与房屋面积对应的房屋价格的数据如下（16个）：\n",
    "\n",
    "145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,\n",
    "69.65,75.69,95.30\n",
    "\n",
    "要求：\n",
    "- 建立二元线性回归模型\n",
    "- 选择均方误差损失函数计算损失\n",
    "- 使用TensorFlow自动求导功能进行求导\n",
    "- 使用梯度下降法求解模型\n",
    "- 对损失进行可视化\n",
    "- 使用模型对新的房屋预测价格。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "f5b4fc39-cbcf-432a-bf1e-e75e642d4b87",
   "metadata": {},
   "source": [
    "### 2.知识准备\n",
    "\n",
    "见教程。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b624ebee-980f-4c1e-b963-a24ff0b669f6",
   "metadata": {},
   "source": [
    "### 3.任务分析\n",
    "\n",
    "假设房屋价格与房屋面积和房间数相关，并且是线性关系。建立二元线性回归的模型，模型公式为$Y=XW$。Y为n行1列，表示预测结果；X为n行m+1列，表示特征矩阵；W为m+1行1列，表示权值向量。其中，n为样本数，此处的值为16；m为特征数，此处的值为2。矩阵形式如下：\n",
    "\n",
    "$$\\left[ \\begin{array} {cccc}\n",
    "y_1\n",
    "\\\\ \n",
    "y_2\n",
    "\\\\\n",
    "...\n",
    "\\\\\n",
    "y_n\n",
    "\\end{array} \\right]=\\left[ \\begin{array} {cccc}\n",
    "1&x_1^1&...&x_1^m\n",
    "\\\\ \n",
    "1&x_2^1&...&x_2^m\n",
    "\\\\\n",
    "...\n",
    "\\\\\n",
    "1&x_n^1&...&x_n^m\n",
    "\\end{array} \\right]*\\left[ \\begin{array} {cccc}\n",
    "w_1\n",
    "\\\\ \n",
    "w_2\n",
    "\\\\\n",
    "...\n",
    "\\\\\n",
    "w_n\n",
    "\\end{array} \\right]$$\n",
    "\n",
    "选择均方误差损失函数，公式如下：\n",
    "\n",
    "$Loss=\\frac{1}{2n}(Y-\\hat{Y}^2)=\\frac{1}{2n}(Y-XW)^2 $\n",
    "\n",
    "式中，Y表示标签矩阵，Y-表示预测值。\n",
    "\n",
    "权值更新公式为：\n",
    "\n",
    "$W^{(k+1)}=W^{(k)}-\\eta \\frac{ \\partial Loss(W)}{ \\partial W}$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "435c6090-cfda-4f46-a550-22a368e41e4a",
   "metadata": {},
   "source": [
    "### 4.任务实施\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "ec75eb6c-5da3-467d-a471-ca3b47242dd6",
   "metadata": {},
   "source": [
    "执行代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2ae9da58-e339-4d22-9f8d-ca255711d89e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=-0.013377065> <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=-1.1628988>\n",
      "0 4749.3623 0.08256537 -1.1619666\n",
      "20 161.90521 0.8486122 -1.1544623\n",
      "40 90.29297 0.9443225 -1.1534352\n",
      "60 89.17503 0.9562799 -1.1532173\n",
      "80 89.157524 0.957773 -1.1531007\n",
      "tf.Tensor(89.852806, shape=(), dtype=float32)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "# 1，加载数据\n",
    "# 面积\n",
    "x=tf.constant([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])\n",
    "# 价格\n",
    "y=tf.constant([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])\n",
    "\n",
    "# 2，设置超参数\n",
    "# 学习率\n",
    "learn_rate=0.00001\n",
    "# 迭代次数\n",
    "iter=100\n",
    "# 显示频率\n",
    "display_step=20\n",
    "\n",
    "# 3，模型参数初始化\n",
    "np.random.seed(612)\n",
    "w=tf.Variable(np.random.randn())\n",
    "b=tf.Variable(np.random.randn())\n",
    "print(w,b)\n",
    "# 4，训练模型\n",
    "# 损失列表\n",
    "mse=[]\n",
    "# 迭代训练\n",
    "for i in range(0,iter):\n",
    "    with tf.GradientTape() as tape:\n",
    "        # 预测值\n",
    "        pred =w*x + b\n",
    "        # 均方误差损失函数\n",
    "        Loss=0.5*tf.reduce_mean(tf.square(y-pred))\n",
    "    # 将损失添加到列表\n",
    "    mse.append(Loss)\n",
    "    # 求导\n",
    "    dL_dw,dL_db=tape.gradient(Loss,[w,b])\n",
    "    # 参数更新\n",
    "    w.assign_sub(learn_rate*dL_dw)\n",
    "    b.assign_sub(learn_rate*dL_db)\n",
    "    # 打印迭代中的损失和模型参数\n",
    "    if i%display_step==0:\n",
    "        print(i,Loss.numpy(),w.numpy(),b.numpy())\n",
    "        \n",
    "\n",
    "# 5，可视化\n",
    "# 绘制损失函数折线图\n",
    "plt.subplot(211)\n",
    "plt.plot(mse)    \n",
    "# 输出散点图\n",
    "plt.subplot(212)\n",
    "# 打印真实值\n",
    "plt.scatter(x,y)\n",
    "# # 打印预测值\n",
    "plt.scatter(x,w*x+b,marker='x')\n",
    "# 6，预测\n",
    "# 面积为95平方米\n",
    "area=95\n",
    "# 使用模型参数计算价格\n",
    "price=area*w+b\n",
    "print(price)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "947bd149-004c-4238-863f-ba125a57b79b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
